<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>let</title>
</head>
<body>
<!--let const var-->
<script>
//    let 语法类似var   生命变量
//    var a = 10;
//    console.log(a); //=>10

/*    for(var i=0;i<5;i++){  //i=5
        console.log(i)//0 ===>4
    }
    console.log(i) //5*/


/*    for(let i=0;i<5;i++){
        console.log(i)
    }
//    console.log(i)*/

/*    var a = 10;
    var a = 20;
    console.log(a)*/

/*    let a = 10;
    let a = 20;
    console.log(a)*/


//ES5 变量提升 (预解释/解析)
//在变量(方法)声明之前 也可以使用 --->预解释(变量提升)


/*console.log(a);  //==undefined
var a = 10;

fn();
function fn() {
    console.log(1)
}*/

//console.log(a);
//let a = 10;

/*{
    let a1 = 10;
    console.log(a1);
    {
        let a1 = 20;
        console.log(a1);
        {
            let a1 = 30;
            console.log(a1);
        }
    }
}*/


//for (let i = 0; i < 5; i++) {
//    console.log(i)
//}

//console.log(a);

//let a = 10;

//
    /*
    * let
    * 1.let所声明的变量,只在块级作用域下有效.
    * 2.let不允许重复声明变量
    * 3.不存在变量提升
    *   在ES5中,会有变量的概念,也就是说变量在声明之前也可以使用,值是undefined
    *   ES6纠正这种这种不合理的现象, let命令强制了语法行为
    *   "暂时性死区": 在69行let声明a变量之前,该a变量都不可以使用;
    *
    *
    *   变量声明：
    *   E6相当于默认开启了严格模式。  变量必须先声明后使用
    *   类似于ES5中: "use strict"
    * */

//    const //声明常量 不可改变的变量  ==>规范, 命名都是大写

    const PI = 3.1415926;
//    PI = 5;



//在方法内部声明的变量,在方法外部不能被访问(闭包);
//function fn() {
//    var cur = "我是fn"
//}
//console.log(cur);
//fn();






console.log("----------------------");

/*
const obj = {
    a: 1
};
//obj.a = 5;

const obj = {
    a: 5
};
console.log(obj);*/


//let a;
const obj


/*
* const 存储一个数值
* 如果存储的是一个对象,实际上是存储的一个地址.
*       只要地址不改变而修改内存空间里的东西这是可以的
*
* */


/*
*
* 总结:
*  let和const命令,用来声明变量,类似于var
*
*  let
*  1.变量只存在块级作用域
*  2.变量不允许重复声明或者定义
*  3.未声明的变量无法使用
*  4.不存在变量提升
*  5.存在暂时性死区
*
*  const
*  1.常量必须赋初始值
*  2.常量不可改变(引用数据类型可以改变内部的值)
*
*
*
*
*
*
*
*
*
*
*
*
* */







</script>
</body>
</html>